package com.texaco.chapasFutbol.scene;

import org.andengine.engine.Engine.EngineLock;
import org.andengine.entity.scene.background.SpriteBackground;
import org.andengine.entity.sprite.Sprite;
import org.andengine.entity.text.Text;
import org.andengine.util.progress.IProgressListener;

import com.texaco.chapasFutbol.R;
import com.texaco.chapasFutbol.buttons.Button;
import com.texaco.chapasFutbol.buttons.IButtonCallBack;
import com.texaco.chapasFutbol.buttons.OptionButton;
import com.texaco.chapasFutbol.entidades.Game;
import com.texaco.chapasFutbol.resources.Resources;

/**
 * Clase que implementa la escena de las opciones.
 * @author texaco
 */
public class OptionScene extends SceneBase{

	OptionButton tipoJuego;
	OptionButton goles;
	OptionButton tiempo;
	OptionButton turno;
	
	public OptionScene(Game game) {
		super(game);

	}

	/**
	 * TODO: ESTABLECER LOS VALORES CORRECTOS PARA LOS BOTONES.
	 */
	@Override
	public void initAsync(IProgressListener pProgressListener) {
		this.setBackground(
				new SpriteBackground(
						new Sprite(0, 0, 
								game.getActivity().getShapesMaps().get(Game.OPTIONS_BACKGROUND_SHAPE), 
								game.getActivity().getVertexBufferObjectManager())));

		android.content.res.Resources resources = game.getActivity().getResources();
		
		float with = this.game.getActivity().getEngine().getCamera().getWidth();
		float height = this.game.getActivity().getEngine().getCamera().getHeight();
		
		Text mOpcionCap = new Text(resources.getInteger(R.integer.layout_left_margin), 
				resources.getInteger(R.integer.layout_top_margin), 
				game.getActivity().getFontMap().get(Resources.FONT_OPTIONS_CAPTION),
				game.getActivity().getString(R.string.tOpsCap), 30,
				game.getActivity().getVertexBufferObjectManager());
		
		this.attachChild(mOpcionCap);
		
		goles = new OptionButton(game, this, 
				with - resources.getInteger(R.integer.layout_right_margin) - 300, 157, R.string.tOpsValorGolesCap, String.valueOf(game.getOpciones().getGolesMax()), 
				game.getActivity().getFontMap().get(Resources.FONT_OPTIONS_SUBCAPTION), 
				game.getActivity().getFontMap().get(Resources.FONT_OPTIONS),  
				new IButtonCallBack() {
							public String fire() {
								game.getActivity().getSoundHandler().playFx(Resources.SOUND_CLICK);
								game.getOpciones().menosGoles();
								return String.valueOf(game.getOpciones().getGolesMax());
							}
						}, 
						new IButtonCallBack() {
							public String fire() {
								game.getActivity().getSoundHandler().playFx(Resources.SOUND_CLICK);
								game.getOpciones().masGoles();
								return String.valueOf(game.getOpciones().getGolesMax());
							}
						});

		tiempo = new OptionButton(game, this, 
				with - resources.getInteger(R.integer.layout_right_margin) - 300, 157, R.string.tOpsValorTiempoCap, String.valueOf(game.getOpciones().getTiempoMaximo()), 
				game.getActivity().getFontMap().get(Resources.FONT_OPTIONS_SUBCAPTION), 
				game.getActivity().getFontMap().get(Resources.FONT_OPTIONS),  
				new IButtonCallBack() {
							public String fire() {
								game.getActivity().getSoundHandler().playFx(Resources.SOUND_CLICK);
								game.getOpciones().menosTiempo();
								return String.valueOf(game.getOpciones().getTiempoMaximo());
							}
						}, 
						new IButtonCallBack() {
							public String fire() {
								game.getActivity().getSoundHandler().playFx(Resources.SOUND_CLICK);
								game.getOpciones().masTiempo();
								return String.valueOf(game.getOpciones().getTiempoMaximo());
							}
						});

		turno = new OptionButton(game, this, 
				with - resources.getInteger(R.integer.layout_right_margin) - 300, 157, R.string.tOpsValorTurnosCap, String.valueOf(game.getOpciones().getTurnos()), 
				game.getActivity().getFontMap().get(Resources.FONT_OPTIONS_SUBCAPTION), 
				game.getActivity().getFontMap().get(Resources.FONT_OPTIONS),  
				new IButtonCallBack() {
							public String fire() {
								game.getActivity().getSoundHandler().playFx(Resources.SOUND_CLICK);
								game.getOpciones().menosTurnos();
								return String.valueOf(game.getOpciones().getTurnos());
							}
						}, 
						new IButtonCallBack() {
							public String fire() {
								game.getActivity().getSoundHandler().playFx(Resources.SOUND_CLICK);
								game.getOpciones().masTurnos();
								return String.valueOf(game.getOpciones().getTurnos());
							}
						});

		Button go = new Button(this.game, this, 
				with - resources.getInteger(R.integer.layout_right_margin) - 300, height - resources.getInteger(R.integer.layout_bottom_margin) - 100, 
				R.string.tLabelButtonGo, 
				game.getActivity().getFontMap().get(Resources.FONT_OPTIONS), 
				Game.BOTON_SIGUIENTE_SHAPE, new IButtonCallBack() {
					public String fire() {
						game.getActivity().getSoundHandler().playFx(Resources.SOUND_CLICK);
						game.loadGameScene();
						return null;
					}
				});
		
		Button back = new Button(this.game, this, 
				with - resources.getInteger(R.integer.layout_right_margin) - go.getWidth() - 30 - 300, 
				height - resources.getInteger(R.integer.layout_bottom_margin) - 100, 
				R.string.tLabelButtonBack, 
				game.getActivity().getFontMap().get(Resources.FONT_OPTIONS), 
				Game.BOTON_ANTERIOR_SHAPE, new IButtonCallBack() {
					public String fire() {
						game.getActivity().getSoundHandler().playFx(Resources.SOUND_CLICK);
						game.loadMenuPrincipalScene();
						return null;
					}
				});
		
//		OptionButton multi = new OptionButton(this.game, this, 
//				resources.getInteger(R.integer.layout_left_margin), 
//				350, R.string.mpp_online, R.string.mpp_online, 
//				game.getActivity().getFontMap().get(Resources.FONT_OPTIONS_SUBCAPTION), 
//				game.getActivity().getFontMap().get(Resources.FONT_OPTIONS),  
//				new IButtonCallBack() {
//							public String fire() {
//								game.getActivity().getSoundHandler().playFx(Resources.SOUND_CLICK);
//								game.getOpciones().toggleMultiplayer();
//								return String.valueOf(game.getOpciones()
//										.isMultiplayer());
//							}
//						}, 
//						new IButtonCallBack() {
//							public String fire() {
//								game.getActivity().getSoundHandler().playFx(Resources.SOUND_CLICK);
//								game.getOpciones().toggleMultiplayer();
//								return String.valueOf(game.getOpciones()
//										.isMultiplayer());
//							}
//						});
//		

		Button bCredits = new Button(game, this, 
				resources.getInteger(R.integer.layout_left_margin), 
				height - resources.getInteger(R.integer.layout_bottom_margin) - 100, 
				R.string.tLabelButtonCredits, 
				game.getActivity().getFontMap().get(Resources.FONT_OPTIONS),  
				Game.BOTON_SIGUIENTE_SHAPE, 
				new IButtonCallBack() {
					public String fire() {
						game.getActivity().getSoundHandler().playFx(Resources.SOUND_CLICK);
						game.loadCreditsScene();
						return null;
					}
				});
		
		tipoJuego = new OptionButton(game, this, 
				resources.getInteger(R.integer.layout_left_margin), 
				156, R.string.tOpsTipoJuegoCap, game.getOpciones().getLabelModoJuego(), 
				game.getActivity().getFontMap().get(Resources.FONT_OPTIONS_SUBCAPTION), 
				game.getActivity().getFontMap().get(Resources.FONT_OPTIONS),  
				new IButtonCallBack() {
							public String fire() {
								game.getActivity().getSoundHandler().playFx(Resources.SOUND_CLICK);
								game.getOpciones().modoAnterior();
								EngineLock lock = game.getActivity().getEngine().getEngineLock();
								lock.lock();
								if(game.getOpciones().isModoGoles()){
									setGoles();
								}else if(game.getOpciones().isModoTiempo()){
									setTiempo();
								}else{
									setTurno();
								}
								lock.unlock();
								return (String) game.getActivity().getText(
										game.getOpciones().getLabelModoJuego());
							}
						}, 
						new IButtonCallBack() {
							public String fire() {
								game.getActivity().getSoundHandler().playFx(Resources.SOUND_CLICK);
								game.getOpciones().modoPosterior();
								EngineLock lock = game.getActivity().getEngine().getEngineLock();
								lock.lock();
								if(game.getOpciones().isModoGoles()){
									setGoles();
								}else if(game.getOpciones().isModoTiempo()){
									setTiempo();
								}else{
									setTurno();
								}
								lock.unlock();
								return (String) game.getActivity().getText(
										game.getOpciones().getLabelModoJuego());
							}



						});
		tiempo.detach();
		turno.detach();
	}

	private void setGoles() {
		goles.attach();
		tiempo.detach();
		turno.detach();
		goles.setValue(String.valueOf(game.getOpciones().getGolesMax()));
	}

	private void setTiempo() {
		goles.detach();
		tiempo.attach();
		turno.detach();
		tiempo.setValue(String.valueOf(game.getOpciones().getTiempoMaximo()));
	}
	
	private void setTurno() {
		goles.detach();
		tiempo.detach();
		turno.attach();
		turno.setValue(String.valueOf(game.getOpciones().getTurnos()));
	}

	@Override
	protected void update() {
		game.getOpciones().setOffline();
		game.getActivity().getEngine().getEngineLock().lock();
		if(game.getOpciones().isModoGoles()){
			setGoles();
		}else if(game.getOpciones().isModoTiempo()){
			setTiempo();
		}else{
			setTurno();
		}
		game.getActivity().getEngine().getEngineLock().unlock();
		tipoJuego.setValue((String) game.getActivity().getText(game.getOpciones().getLabelModoJuego()));
	}

	@Override
	protected boolean async() {
		return true;
	}
}